home *** CD-ROM | disk | FTP | other *** search
/ Programmer Plus 2007 / Programmer-Plus-2007.iso / Programming / XML Utilities / Professional Programmer XSL IDE / Xselerator25.msi / Data.Cab / F28760_curry.xsl < prev    next >
Encoding:
Extensible Markup Language  |  2002-02-23  |  7.7 KB  |  223 lines

  1. <xsl:stylesheet version="1.0" 
  2.  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  3.  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  4.  xmlns:curryPartialApplicator="f:curryPartialApplicator"
  5.  exclude-result-prefixes="msxsl curryPartialApplicator"
  6.  >
  7.  
  8.   <xsl:template name="curry">
  9.     <xsl:param name="pFun" select="/.."/>
  10.     <xsl:param name="pNargs" select="2"/>
  11.     <xsl:param name="args" select="/.."/>
  12.     <xsl:param name="arg1" select="/.."/>
  13.     <xsl:param name="arg2" select="/.."/>
  14.     <xsl:param name="arg3" select="/.."/>
  15.     <xsl:param name="arg4" select="/.."/>
  16.     <xsl:param name="arg5" select="/.."/>
  17.     <xsl:param name="arg6" select="/.."/>
  18.     <xsl:param name="arg7" select="/.."/>
  19.     <xsl:param name="arg8" select="/.."/>
  20.     <xsl:param name="arg9" select="/.."/>
  21.     <xsl:param name="arg10" select="/.."/>
  22.     
  23.     <xsl:if test="$pNargs < 2">
  24.       <xsl:message terminate="yes">
  25.          [curry]Error: pNargs (number of arguments) of a fn to be 
  26.                        curried must be at least 2
  27.       </xsl:message>
  28.     </xsl:if>
  29.     
  30.     <xsl:if test="$pNargs > 10">
  31.       <xsl:message terminate="yes">
  32.          [curry]Error: pNargs (number of arguments) of a fn to be 
  33.                        curried must not exceed 10
  34.       </xsl:message>
  35.     </xsl:if>
  36.     
  37.     <!-- Build the Resulting fn with an empty Arguments store -->
  38.     <xsl:variable name="vrtfCurriedNoArgs">
  39.         <curryPartialApplicator:curryPartialApplicator>
  40.             <fun><xsl:copy-of select="$pFun"/></fun>
  41.             <curryNumargs><xsl:value-of select="$pNargs"/></curryNumargs>
  42.         </curryPartialApplicator:curryPartialApplicator>
  43.     </xsl:variable>
  44.     
  45.     <xsl:variable name="vCurriedNoArgs" 
  46.                   select="msxsl:node-set($vrtfCurriedNoArgs)/*"/>
  47.     
  48.     <xsl:choose>
  49.       <xsl:when test="not($args)
  50.                     and 
  51.                       not($arg1 or $arg2 or $arg3 or $arg4 or $arg5   
  52.                        or $arg6 or $arg7 or $arg8 or $arg9 or $arg10   
  53.                           )">
  54.         <xsl:copy-of select="$vCurriedNoArgs"/>
  55.       </xsl:when>
  56.       <xsl:otherwise>
  57.         <xsl:apply-templates select="$vCurriedNoArgs">
  58.                 <xsl:with-param name="args" select="$args"/>
  59.                 <xsl:with-param name="arg1" select="$arg1"/>
  60.                 <xsl:with-param name="arg2" select="$arg2"/>
  61.                 <xsl:with-param name="arg3" select="$arg3"/>
  62.                 <xsl:with-param name="arg4" select="$arg4"/>
  63.                 <xsl:with-param name="arg5" select="$arg5"/>
  64.                 <xsl:with-param name="arg6" select="$arg6"/>
  65.                 <xsl:with-param name="arg7" select="$arg7"/>
  66.                 <xsl:with-param name="arg8" select="$arg8"/>
  67.                 <xsl:with-param name="arg9" select="$arg9"/>
  68.                 <xsl:with-param name="arg10" select="$arg10"/>
  69.         
  70.         </xsl:apply-templates>
  71.       </xsl:otherwise>
  72.     </xsl:choose>
  73.   </xsl:template>
  74.   
  75.   <xsl:template match="curryPartialApplicator:*">
  76.     <xsl:param name="args" select="/.."/>
  77.     <xsl:param name="arg1" select="/.."/>
  78.     <xsl:param name="arg2" select="/.."/>
  79.     <xsl:param name="arg3" select="/.."/>
  80.     <xsl:param name="arg4" select="/.."/>
  81.     <xsl:param name="arg5" select="/.."/>
  82.     <xsl:param name="arg6" select="/.."/>
  83.     <xsl:param name="arg7" select="/.."/>
  84.     <xsl:param name="arg8" select="/.."/>
  85.     <xsl:param name="arg9" select="/.."/>
  86.     <xsl:param name="arg10" select="/.."/>
  87.     
  88.     <xsl:if test="not($args)
  89.                   and 
  90.                     not($arg1 or $arg2 or $arg3 or $arg4 or $arg5   
  91.                      or $arg6 or $arg7 or $arg8 or $arg9 or $arg10   
  92.                         )">
  93.       <xsl:message terminate="yes">
  94.          [currying]Error: No arguments specified!      
  95.       </xsl:message>
  96.     </xsl:if>
  97.     
  98.     <xsl:variable name="vrtvArgs">
  99.       <xsl:copy-of select="$args"/>
  100.       <xsl:if test="$arg1">
  101.         <arg1>
  102.           <xsl:copy-of select="$arg1"/>
  103.         </arg1>
  104.       </xsl:if>
  105.       <xsl:if test="$arg2">
  106.         <arg2>
  107.           <xsl:copy-of select="$arg2"/>
  108.         </arg2>
  109.       </xsl:if>
  110.       <xsl:if test="$arg3">
  111.         <arg3>
  112.           <xsl:copy-of select="$arg3"/>
  113.         </arg3>
  114.       </xsl:if>
  115.       <xsl:if test="$arg4">
  116.         <arg4>
  117.           <xsl:copy-of select="$arg4"/>
  118.         </arg4>
  119.       </xsl:if>
  120.       <xsl:if test="$arg5">
  121.         <arg5>
  122.           <xsl:copy-of select="$arg5"/>
  123.         </arg5>
  124.       </xsl:if>
  125.       <xsl:if test="$arg6">
  126.         <arg6>
  127.           <xsl:copy-of select="$arg6"/>
  128.         </arg6>
  129.       </xsl:if>
  130.       <xsl:if test="$arg7">
  131.         <arg7>
  132.           <xsl:copy-of select="$arg7"/>
  133.         </arg7>
  134.       </xsl:if>
  135.       <xsl:if test="$arg8">
  136.         <arg8>
  137.           <xsl:copy-of select="$arg8"/>
  138.         </arg8>
  139.       </xsl:if>
  140.       <xsl:if test="$arg9">
  141.         <arg9>
  142.           <xsl:copy-of select="$arg9"/>
  143.         </arg9>
  144.       </xsl:if>
  145.       <xsl:if test="$arg10">
  146.         <arg10>
  147.           <xsl:copy-of select="$arg10"/>
  148.         </arg10>
  149.       </xsl:if>
  150.     </xsl:variable>
  151.     
  152.     <xsl:variable name="vArgs" select="msxsl:node-set($vrtvArgs)/*"/>
  153.     
  154.     <xsl:if test="count($vArgs) > curryNumargs">
  155.       <xsl:message>
  156.         <xsl:value-of select="concat('[currying]Error: The number of actual arguments supplied is ',
  157.                                       count($vArgs), ' -- bigger than the number of arguments of this function:',
  158.                                       curryNumargs
  159.                                      )"/>
  160.       </xsl:message>
  161.     </xsl:if>
  162.     
  163.     <xsl:if test="$vArgs = curryArgs/*">
  164.       <xsl:message>[currying]Error: Same argument(s) fixed twice</xsl:message>
  165.     </xsl:if>
  166.     
  167.     <xsl:for-each select="$vArgs[not(position()=last())]">
  168.       <xsl:variable name="vThisPosition" select="position()"/>
  169.       <xsl:if test=". = $vArgs[position() > $vThisPosition
  170.                              and
  171.                                name() = name(current())
  172.                                ]">
  173.         <xsl:message>[currying]Error: Same argument(s) specified twice</xsl:message>
  174.       </xsl:if>
  175.     </xsl:for-each>
  176.     
  177.     <!-- Normal  Processing -->
  178.     <xsl:variable name="vrtfNewFun">
  179.       <curryPartialApplicator:curryPartialApplicator>
  180.         <xsl:copy-of select="fun"/>
  181.         <xsl:copy-of select="curryNumargs"/>
  182.         <curryArgs>
  183.           <xsl:copy-of select="curryArgs/*"/>
  184.           <xsl:copy-of select="$vArgs"/>
  185.         </curryArgs>
  186.       </curryPartialApplicator:curryPartialApplicator>
  187.     </xsl:variable>
  188.     
  189.     <xsl:variable name="vNewFun" select="msxsl:node-set($vrtfNewFun)/*"/>
  190.  
  191.     <xsl:choose>
  192.       <xsl:when test="curryNumargs > count($vNewFun/curryArgs/*)">
  193.         <xsl:copy-of select="$vNewFun"/>
  194.       </xsl:when>
  195.       <xsl:otherwise>
  196.         <xsl:apply-templates select="fun/*[1]">
  197.           <xsl:with-param name="arg1"
  198.                           select="$vNewFun/curryArgs/arg1/node()"/>
  199.           <xsl:with-param name="arg2"
  200.                           select="$vNewFun/curryArgs/arg2/node()"/>
  201.           <xsl:with-param name="arg3"
  202.                           select="$vNewFun/curryArgs/arg3/node()"/>
  203.           <xsl:with-param name="arg4"
  204.                           select="$vNewFun/curryArgs/arg4/node()"/>
  205.           <xsl:with-param name="arg5"
  206.                           select="$vNewFun/curryArgs/arg5/node()"/>
  207.           <xsl:with-param name="arg6"
  208.                           select="$vNewFun/curryArgs/arg6/node()"/>
  209.           <xsl:with-param name="arg7"
  210.                           select="$vNewFun/curryArgs/arg7/node()"/>
  211.           <xsl:with-param name="arg8"
  212.                           select="$vNewFun/curryArgs/arg8/node()"/>
  213.           <xsl:with-param name="arg9"
  214.                           select="$vNewFun/curryArgs/arg9/node()"/>
  215.           <xsl:with-param name="arg10"
  216.                           select="$vNewFun/curryArgs/arg10/node()"/>
  217.         </xsl:apply-templates>
  218.       </xsl:otherwise>
  219.     </xsl:choose>
  220.     
  221.     
  222.   </xsl:template>
  223. </xsl:stylesheet>